{
  // 最长连续序列
  // 给定一个未排序的整数数组 nums ，找出数字连续的最长序列（不要求序列元素在原数组中连续）的长度。
  // 进阶：你可以设计并实现时间复杂度为 O(n) 的解决方案吗？
  //
  // 示例 1：
  // 输入：nums = [100,4,200,1,3,2]
  // 输出：4
  // 解释：最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
  //
  // 示例 2：
  // 输入：nums = [0,3,7,2,5,8,4,6,0,1]
  // 输出：9

  /**
   * @param {number[]} nums
   * @return {number}
   */
  var longestConsecutive = function (nums) {
    if (nums.length === 0) return 0;

    // 排序
    nums.sort((a, b) => a - b);

    // 去重
    nums = [...new Set(nums)];

    let maxLen = 1; // 记录连续最长序列
    let curLen = 1; // 记录当前序列
    for (let i = 0; i < nums.length - 1; i++) {
      if (nums[i + 1] - nums[i] === 1) {
        curLen++;
        if (nums.length - 2 === i) {
          // 处理遍历到最后一位的情况（有可能最后一次是最长的序列）
          maxLen = curLen > maxLen ? curLen : maxLen;
        }
      } else {
        // 每次不连续的时候判断是否是最长，并初始化 curLen
        maxLen = curLen > maxLen ? curLen : maxLen;
        curLen = 1;
      }
    }

    return maxLen;
  };

  console.log(longestConsecutive([100, 4, 200, 1, 3, 2]));
  console.log(longestConsecutive([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]));
}

{
  // 字符串的全排列

  // 法一
  // 解题思路
  // 递归
  // 1 当字符串长度为1的时候结束递归
  // 2 每次留一个字符，然后与剩下的字符串相加
  // 3 最终返回一个所有的字符串数组

  function fullPer(str) {
    const len = str.length;
    if (len === 1) {
      return [str];
    }

    let result = [];

    for (let i = 0; i < len; i++) {
      let first = str[i]; // 当前字符，即每次保留的字符
      let last = str.replace(first, ''); // 剩余字符

      let middle = fullPer(last).map(item => item + first); // 通过遍历的方式添加保留的字符

      result = result.concat(middle); // 将每次结果连接到最终结果
    }

    return result
  }
  // console.log(fullPer('abc'));

  // 法二
  // 采用插空的方法，每次选一个字符，在剩余字符串中进行插空
  // 递归

  // ？？？
  function permutations(string) {
    const result = [];
    if (string.length === 1) {
      return [string];
    } else {
      var pre = permutations(string.slice(1));
      for (var j = 0; j < pre.length; j++) {
        for (var k = 0; k < pre[j].length + 1; k++) {
          var temp = pre[j].slice(0, k) + string[0] + pre[j].slice(k);
          result.push(temp);
        }
      }
      return [...new Set(result)];
    }
  }

  console.log(permutations('abc'));
}